# -*- coding:utf-8 -*-
# 注意编码，必须加上第一行，否则会报错
# import ssl
# ssl._create_default_https_context =ssl._create_stdlib_context # 解决Mac开发环境下，网络错误的问题

from celery_task.sms.communicationCloud.CCPRestSDK import REST

accountSid = '8aaf0708701ea9ab01704828f7a0124f'
# 说明：主账号，登陆云通讯网站后，可在控制台首页中看到开发者主账号ACCOUNT SID。

accountToken = '7c60b016f0c643acb43804dbdf8bbf66'
# 说明：主账号Token，登陆云通讯网站后，可在控制台首页中看到开发者主账号AUTH TOKEN。

appId = '8aaf0708701ea9ab01704828f8021256'
# 请使用管理控制台中已创建应用的APPID。

serverIP = 'app.cloopen.com'
# 说明：请求地址，生产环境配置成app.cloopen.com。

serverPort = '8883'
# 说明：请求端口 ，生产环境为8883.

softVersion = '2013-12-26';  # 说明：REST API版本号保持不变。

# 实现短信验证码单例类
class SendSMS(object):
    # 当前类对象：cls
    def __new__(cls, *args, **kwargs):
        # 初始化单例，单例不存在，进行初始化，_下划线定义为私有属性，_instance存储单例
        if not hasattr(cls, '_instance'):
            print("单例不存在，初始化")
            # 将cls类对象绑定_instance属性
            cls._instance = super(SendSMS, cls).__new__(cls, *args, **kwargs)

            # 初始化rest,与_instance同生共死
            # rest绑定入cls
            cls._instance.rest = REST(serverIP, serverPort, softVersion)
            cls._instance.rest.setAccount(accountSid, accountToken)
            cls._instance.rest.setAppId(appId)

        print("返回单例")
        return cls._instance

    # 发送验证码方法，面向对象原则，哪个对象调用对象方法，self指向哪个对象
    def send(self, to, datas, tempId):
        print("给手机：",to," datas：",datas)
        result = self.rest.sendTemplateSMS(to, datas, tempId)
        print("发送短信>>: ", result)
        '''
        发送短信>>:  {'statusCode': '111139', 'statusMsg': '【账号】主账户已暂停'}，没话费了哈哈
        {'172001': '网络错误'} 免费的经常出现这种情况
        '''
        # 返回code=0成功，1失败
        if result.get('statusCode') == '000000':
            return 0
        else:
            return 1


if __name__ == '__main__':
    ''' 
    sendTemplateSMS(self, to,datas,tempId)
    测试模板id是1。
    测试模板的内容是：【云通讯】您使用的是云通讯短信模板，您的验证码是{1}，请于{2}分钟内正确输入
    '''

    #单例实现
    SendSMS().send('16619954809', ['1234', 5], 1)
